Process Analysis Toolkit (PAT) 3.5 Help |
Declaration ; specBody |
assertion |
definition library ; letDefintion :
'var' ID ('<' datatype=ID '>')? variableRange? ('=' expression)?
';' //user defined datatype is supported using <type>
|
'var' ID variableRange? '=' recordExpression ';' |
'var' ID ('[' expression ']')+ variableRange? ('='
recordExpression)? ';' //multi-dimensional array is
supported
| ('clock') ID ('[' expression ']')?
';' variableRange
:':' '{' additiveExpression?'..' additiveExpression? '}' ; recordExpression
: '[' recordElement (','recordElement)* ']' ; recordElement :
e1=expression ('(' e2=expression ')')? | e1=expression '..'
e2=expression
; assertion :
'#' 'assert' definitionRef
( (
'|=' ( '(' | ')' | '[]' | '<>' | ID | STRING | '!' | '?' | '&&' |
'||' | '->' | '<->' | '/\\' | '\\/' | '.' | INT )+ ) | 'deadlockfree'
| 'nonterminating'
| 'divergencefree' | 'deterministic'
|
'reaches' ID withClause | 'refines' definitionRef |
'refines' '<F>'
definitionRef | 'refines' '<FD>' definitionRef
)
';' ; withClause
: (specBody)*
:
library
|
letDefintion
|
define
|
channel
;
:
'#' 'import' STRING ';' //import the library by full dll path or DLL
name under the Lib folder
;
;
definitionRef
:
ID ('(' ')')?
;
define : '#' 'define' ID INT ';'
| '#' 'define' ID ('true' | 'false') ';'
|
'enum' '{' ID (',' ID)* '}' ';'
| '#' 'define' ID conditionalOrExpression ';'
;
block : '{'
statement* expression? '}'
;
statement
: block
|
localVariableDeclaration
|
ifExpression
|
whileExpression
|
expression ';'
|
';'
;
localVariableDeclaration
: 'var' ID ('=' expression)? ';'
| 'var' ID '=' recordExpression ';'
;
expression
:
conditionalOrExpression ('=' expression)?
;
conditionalOrExpression
:
conditionalAndExpression ( '||' conditionalAndExpression )*
conditionalAndExpression
:
equalityExpression ( '&&' equalityExpression)*
;
equalityExpression
:
relationalExpression( ('==' | '!=') relationalExpression)*
;
relationalExpression
:
additiveExpression ( ('<' | '>' | '<=' | '>=') additiveExpression)*
;
additiveExpression
:
multiplicativeExpression ( ('+' | '-') multiplicativeExpression)*
;
multiplicativeExpression
:
unaryExpression ( ('*' | '/' | '%' ) unaryExpression)*
;
unaryExpression
:
'+' unaryExpression
| '-' unaryExpression
| '!' unaryExpressionNotPlusMinus
| unaryExpressionNotPlusMinus '++'
| unaryExpressionNotPlusMinus '--'
| unaryExpressionNotPlusMinus
;
unaryExpressionNotPlusMinus
: INT
|
'true'
| 'false'
| 'call' '(' ID (',' conditionalOrExpression)* ')'
| new ID '(' (conditionalOrExpression ',' conditionalOrExpression)*)? ')'
| ID '.' ID '(' (conditionalOrExpression ',' conditionalOrExpression)*)? ')'
| arrayExpression '.' ID '(' (conditionalOrExpression (',' conditionalOrExpression)*)? ')'
| arrayExpression
|
'(' conditionalOrExpression ')'
| ID
;
arrayExpression
: ID ('[' conditionalOrExpression ']')+
;
ifExpression
: 'if' '(' expression ')' statement ('else'
statement)?
;
whileExpression
:
'while' '(' expression ')' statement
;
channel
: 'channel' ID ('[' expression ']')? ';'
;
definition
: ID '=' interleaveExpr ';'
| 'Process' STRING ('(' (ID (',' ID )*)? ')')? '[' STRING ']' ':' stateDef+ transition* ';'
;
stateDef
: 'State:' STRING clockConstraints? '[U]'? '[C]'?
;
transition
:
STRING '--' select? clockConstraints? ('[' conditionalOrExpression ']')? '##@@' eventM '@@##' (block)?
clockRestExpression? '-->' STRING
;
interleaveExpr
:
indexedInterleave ( ('|||' indexedInterleave)+)
;
indexedInterleave
:
atom
| '|||' (paralDef
(';' paralDef )*) '@'
atom
| '('!
indexedInterleave ')'
;
paralDef
: ID ':' '{' additiveExpression (',' additiveExpression)*
'}'
| ID ':' '{' additiveExpression '..' additiveExpression '}'
;
select
:
'select' ':' (paralDef (';' paralDef )*)
;
clockConstraints
: 'clocks' ':' '<' clockConstraint ('&&' clockConstraint)*
'>'
;
clockConstraint
: additiveExpression ('<='|'<'|'=='|'>'|'>=')
additiveExpression
;
clockRestExpression
: 'clockreset' ':' unaryExpressionNotPlusMinus (','
unaryExpressionNotPlusMinus )*
;
atom
: ID ('(' (expression
(',' expression )*)? ')')?
;
eventM
: ID ( '.'
additiveExpression)*
| 'tau'
| ID '!'
| ID '?'
;
ID
: ('a'..'z'|'A'..'Z'|'_')
('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;
STRING
:
'"' (~('"') )* '"'
;
WS
: (' '|'\r'|'\t'|'\u000C'|'\n')
;
INT
: ('0'..'9')+
;
COMMENT
: '/*' ( : . )* '*/'
;
LINE_COMMENT
: '//' ~('\n'|'\r')* '\r'?
'\n'
;